package prjtgl.metier.comptes;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.*;
import org.zkoss.zk.ui.util.Clients;
import prjtgl.bdd.comptes.HMembre;
import prjtgl.bdd.comptes.interactions_utilisateur.HContact;
import prjtgl.bdd.comptes.interactions_utilisateur.HDemandeContact;
import prjtgl.bdd.comptes.profil_utilisateur.poste.HExperience;
import prjtgl.metier.Application;
import prjtgl.metier.comptes.interactions_utilisateur.Contact;
import prjtgl.metier.comptes.interactions_utilisateur.DemandeContact;
import prjtgl.metier.comptes.interactions_utilisateur.Signalement;
import prjtgl.metier.comptes.profil_societe.Societe;
import prjtgl.metier.comptes.profil_utilisateur.*;
import prjtgl.metier.comptes.profil_utilisateur.poste.Experience;

/**
 * Membre
 *
 * @author Lucie
 */
@Entity
@PrimaryKeyJoinColumn(name = "id")
@Table(name = "membre")
public class Membre extends Utilisateur {

	/**
	 * Nom du membre
	 */
	private String nom;
	/**
	 * Prenom du membre
	 */
	private String prenom;
	/**
	 * VRAI si le membre est disponible, FAUX sinon
	 */
	private boolean estDisponible;
	/**
	 * Signalements re�us a l'encontre du membre
	 */
	private ArrayList<Signalement> signalementsRecus;
	/**
	 * Domaines d'expertise du membre
	 */
	private List<DomaineExpertise> domaines;
	/**
	 * Disponibilite du membre
	 */
	private Disponibilite disponibilite;
	/**
	 * Demandes de contacts
	 */
	private ArrayList<DemandeContact> demandesContacts;
	/**
	 * Contacts du membre
	 */
	private ArrayList<Membre> contacts;
	/**
	 * Experiences du membre
	 */
	private List<Experience> experiences;
	/**
	 * Profil du membre
	 */
	private Profil profil;

	/*
	 public void addRequestContact(Membre membreEnvoye)
	 {
	 java.util.Date date = new java.util.Date();
	 DemandeContact demandeContact = new DemandeContact();
	 demandeContact.setDemande(this);
	 demandeContact.setDemandeur(membreEnvoye);
	 demandeContact.setDate(date);
	 }
	 */
	public void addDemandeContact(Membre membreDemande) {
		java.util.Date date = new java.util.Date();
		DemandeContact demandeContact = new DemandeContact();
		if (demandesContacts == null) {
			demandesContacts = new ArrayList<DemandeContact>();
		}

		demandeContact.setDemande(membreDemande);
		demandeContact.setDemandeur(this);
		demandeContact.setDate(date);
		demandesContacts.add(demandeContact);

		HDemandeContact hdc = new HDemandeContact();
		hdc.enregistrer(demandeContact);
	}

	/**
	 * Ajoute le membre a la liste des contacts et supprime la demande
	 *
	 * @param demande Demande
	 */
	public void accepterDemande(Membre demandeur) {
		
		HDemandeContact hdc = new HDemandeContact();
		
		List<DemandeContact> liste = hdc.listerToutesDemandesRecues(this);
		
		for(DemandeContact c : liste){
			if(c.getDemandeur() != null && demandeur !=null && c.getDemandeur().getId() == demandeur.getId()){
				c.accepter();
			}
		}
		
	}

	/**
	 * Ajoute une experience au membre
	 *
	 * @param dateDebut Date de debut de l'experience
	 * @param dateFin Date de fin de l'experience
	 * @param description Description de l'experience
	 * @param nomSociete Nom de la societe ou s'est deroulee l'experience
	 * @param intituleProfil Intitule du profil
	 * @param intitulePoste Intitule du poste
	 * @param direction Intitule de la direction
	 */
	public void ajouterExperience(String dateDebut, String dateFin, String description, String nomSociete, String intituleProfil, String intitulePoste, String direction) {
		HExperience hexperience = new HExperience();
		Experience experience = new Experience();

		DateFormat df = new SimpleDateFormat("mm/dd/yyyy");
		Date date1, date2;
		try {
			date1 = df.parse(dateDebut);
			date2 = df.parse(dateFin);




			experience.editerPoste(intitulePoste);
			experience.setSociete(Application.getInstance().rechercherSociete(nomSociete));
			//experience.setDirection();
			experience.editer(date1, date2, estDisponible, description);


		} catch (ParseException ex) {
			Logger.getLogger(Membre.class.getName()).log(Level.SEVERE, null, ex);
		}

		throw new UnsupportedOperationException("Not supported yet.");
		//HExperience experience = new HExperience();
		//  Experience objExp = new Experience();


		//objExp.setDateDebut(dateDebut);

	}

	/**
	 * Modifier les parametres du compte du membre
	 *
	 * @param nom Nom du membre
	 * @param prenom Prenom du membre
	 * @param motDePasse Mot de passe du compte
	 */
	public void modifierParametresCompte(String nom, String prenom, String motDePasse) {
		this.nom = nom;
		this.prenom = prenom;
		this.setMotDePasse(motDePasse);
	}

	/**
	 * Obtenir la liste des demandes de contact
	 *
	 * @return Liste des demandes de contact
	 */
	public Collection<DemandeContact> listerDemandeContact() {
		return this.demandesContacts;
	}

	/**
	 * Supprime la demande de contact realisee par un autre membre
	 *
	 * @param membre Le membre qui a fait la demande de contact
	 */
	public void refuserDemandeContact(Membre membre) {
		int position = -1;
		for (DemandeContact d : this.demandesContacts) {
			if (d.getDemandeur().equals(membre)) {
				position = this.demandesContacts.indexOf(d);
			}
		}
		if (position != -1) {
			this.demandesContacts.remove(position);
		}

	}

	/**
	 * Supprime une experience du membre
	 *
	 * @param e L'experience a supprimer
	 */
	public void supprimerExperience(Experience e) {
		this.experiences.remove(e);
	}

	/**
	 * Obtenir la societe actuelle du membre
	 *
	 * @return Intitule de la societe
	 */
	public String obtenirSocieteActuelle() {
		HMembre hm = new HMembre();
		Societe s = hm.getSocieteCourante(this);
		if (s == null) {
			return "Pas de société actuellement";
		} else {
			return s.getNom();
		}
	}

	/**
	 * Retourne si le membre est disponible
	 *
	 * @return VRAI si le membre est disponible, FAUX sinon
	 */
	public Boolean obtenirEstDisponible() {
		// TODO
		throw new UnsupportedOperationException("Not supported yet.");
	}

	/**
	 * Calcule le nombre d'annees d'experiences du membre
	 *
	 * @return Nombre d'annees d'experiences
	 */
	public long calculerCumulExperiences() {
		HMembre hm = new HMembre();
		return hm.calculerCumulExperience(this);
	}

	/**
	 * Retourne le nom du membre
	 *
	 * @return Nom du membre
	 */
	@Column(name = "nom")
	public String getNom() {
		return nom;
	}

	/**
	 * Mutateur du nom du membre
	 *
	 * @param nom Nouveau nom
	 */
	public void setNom(String nom) {
		this.nom = nom;
	}

	/**
	 * Retourne le prenom du membre
	 *
	 * @return Prenom du membre
	 */
	@Column(name = "prenom")
	public String getPrenom() {
		return prenom;
	}

	/**
	 * Mutateur du prenom du membre
	 *
	 * @param prenom Nouveau prenom
	 */
	public void setPrenom(String prenom) {
		this.prenom = prenom;
	}

	/**
	 * Retourne la disponibilite du membre
	 *
	 * @return Disponibilite
	 */
	@Column(name = "disponible")
	public boolean getEstDisponible() {
		return estDisponible;
	}

	/**
	 * Mutateur de la disponibilite du membre
	 *
	 * @param estDisponible Nouvelle disponibilite. VRAI si le membre est
	 * disponible, FAUX sinon
	 */
	public void setEstDisponible(boolean estDisponible) {
		this.estDisponible = estDisponible;
	}

	/**
	 * Retourne le profil du membre
	 *
	 * @return Profil
	 */
	@ManyToOne
	@JoinColumn(name = "id_profil")
	public Profil getProfil() {
		return profil;
	}

	/**
	 * Mutateur du profil du membre
	 *
	 * @param profil Nouveau profil du membre
	 */
	public void setProfil(Profil profil) {
		this.profil = profil;
	}

	/**
	 * Retourne les experiences du membre
	 *
	 * @return Liste des experiences du membre
	 */
	@OneToMany(mappedBy = "membre", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	public List<Experience> getExperiences() {
		return experiences;
	}

	/**
	 * Mutateur des experiences du membre
	 *
	 * @param experiences Nouvelle liste des experiences
	 */
	public void setExperiences(List<Experience> experiences) {
		this.experiences = experiences;
	}

	@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	@JoinTable(name = "domaine_membre",
	joinColumns = {
		@JoinColumn(name = "id_membre")},
	inverseJoinColumns = {
		@JoinColumn(name = "id_domaine")})
	public List<DomaineExpertise> getDomaines() {
		return domaines;
	}

	public void setDomaines(List<DomaineExpertise> domaines) {
		this.domaines = domaines;
	}

	@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	@JoinColumn(name = "id")
	public Disponibilite getDisponibilite() {
		return disponibilite;
	}

	public void setDisponibilite(Disponibilite disponibilite) {
		this.disponibilite = disponibilite;
	}

	/**
	 * Retourne la liste du membre courant
	 *
	 * @return Liste des contacts du membre courant
	 */
	public List<Membre> listerContact() {
		HContact hc = new HContact();
		return hc.listerContacts(this);
	}

	public List<DemandeContact> listerDemandeEnvoyes() {
		HDemandeContact hdc = new HDemandeContact();
		return hdc.listerToutesDemandesEnvoyees(this);
	}

	public List<DemandeContact> listerDemandeRecues() {
		HDemandeContact hdc = new HDemandeContact();
		return hdc.listerToutesDemandesRecues(this);
	}
}